#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct sockaddr_in adresse_t;
typedef struct hostent * host_t;

/**
 * crée un socket UDP
 */
int udpSocket(){
    int descSock;

    // création du socket
    descSock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

    // si il y a une erreur retrouner -1
    if ( 0 > descSock ){
        fprintf(stderr, "ERREUR : socketUdpServeur()\n");
        return -1;
    }

    fprintf(stdout, "Création du socket : OK.\n");

    return descSock;

}

adresse_t udpAdresseServeur(unsigned short int port){

    adresse_t adresse ;

    // definition du type d'adrese internet
    adresse.sin_family = PF_INET;
    // définition de l'ecoute sur toute les interfaces
    adresse.sin_addr.s_addr = htonl(INADDR_ANY);
    // définition du port d'écoute
    adresse.sin_port = port;
    fprintf(stdout, "Initialisation de l'adresse du serveur : OK.\n");
    
    return adresse;
}

adresse_t udpAdresseClient(char * name, unsigned short int port){

    adresse_t adresse;
    host_t host;

    // résolution du nom
    if (NULL == ( host = gethostbyname(name) ) ){
        fprintf(stderr, "Problème dans l'interprétation des informations d'hôte : %s\n", "localhost");
        return adresse;

    }


    // récupération du type d'adresse
    adresse.sin_family = host->h_addrtype;
    // récupération de l'adresse 
    memcpy( (char*) &adresse.sin_addr.s_addr, host->h_addr_list[0], host->h_length);
    // récupération du port
    adresse.sin_port = port;

    return adresse;
}

int udpLien( int socket, adresse_t * adresse){
    if( 0 > ( bind( socket, ( struct sockaddr * ) adresse, 
                    sizeof( struct sockaddr_in ) ) ) 
    ){
        fprintf( stderr, "ERREUR : Echec de liaison du socket en écoute\n" );
        perror("erreur");
        return -1;
    }
    fprintf( stdout, "Ecoute du socket : OK.\n" );
    return 0;
}
